<?php
/*
 * 网络请求辅助类
 * 用于像其他第三方服务器发起网络请求
 * 查询参数可以查找这个链接
 * 	https://blog.csdn.net/hjq198988/article/details/46239051
 */
class Curl{
	
	#错误码
	protected $codeArray=[
		
	];
	
	/* 在https协议下发送post数据*/
	function post_https($url,$data){ 
		// 模拟提交数据函数
		$curl = curl_init(); // 启动一个CURL会话
		curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 不对认证证书来源检查
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在 只能取值0和2 
		curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
		curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
		curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // 设置Post提交的数据包
		curl_setopt($curl, CURLOPT_TIMEOUT, 60); // 设置超时60秒限制防止死循环
		curl_setopt($curl, CURLOPT_HEADER, 0); // 不显示返回的Header区域内容
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
		$tmpInfo = curl_exec($curl); // 执行操作
		if (curl_errno($curl)) {
			echo 'Errno'.curl_error($curl);//捕抓异常
		}
		curl_close($curl); // 关闭CURL会话
		return $tmpInfo; // 返回数据，json格式
	}

	
	#post方式只返回文本
	function postText($url, $guanLianArray){
		$jsonStr = json_encode($guanLianArray);
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);		#只返回结果不自动输出内容
		curl_setopt($ch, CURLOPT_HTTPHEADER, 
			array(
				'Content-Type: application/json; charset=utf-8',
				'Content-Length: ' . strlen($jsonStr)	
			)
		);
		$response = curl_exec($ch);
		#获取本次请求返回值
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
		if($httpCode!=200){
			switch($httpCode){
				case 0:
					echo '网络失联';					
					var_dump($response); 
					break;
					
				case 504:
					echo '网络超时';					
					var_dump($response); 
					break;
			}
			echo 'Curl :: postText() return httpCode:'.$httpCode.' is error ';
			return false;
		}
		return $response;
	}
	
	//get方式安静返回文本
	function getText($url){
		$ch=curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);				#网址
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);		#不会直接输出结果
		curl_setopt($ch, CURLOPT_HEADER, 0);				#不要返回头
		$output = curl_exec($ch);							#var_dump($output); //返回值是字符串
		curl_close($ch);
		return $output;
		//print_r($output);	//字符串，不需要print_r
	}
	
	
	//get方式请求 输出文本
	function get($url='http://www.baidu.com'){
		$ch=curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);				#这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项。
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);		#不直接输出结果
		curl_setopt($ch, CURLOPT_HEADER, 0);				#如果你想把一个头包含在输出中，设置这个选项为一个非零值。
		$output = curl_exec($ch);
		curl_close($ch);
		//var_dump($output); //返回值是字符串
		echo $output;
		return $output;
		//print_r($output);	//字符串，不需要print_r
	}
	
	//图灵接口可以使用，实际使用ok
	//请求网址，参数关联数组，返回一个数组，带有状态值和结果
	function postJson($url, $guanLianArray)
	{
		$jsonStr = json_encode($guanLianArray);
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_HTTPHEADER, 
			array(
				'Content-Type: application/json; charset=utf-8',
				'Content-Length: ' . strlen($jsonStr)
			)
		);
		$response = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
		return array($httpCode, $response);
	}
	
	//适合小程序使用，获取openid
	function getXCX($url){
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL,$url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
		$output = curl_exec($ch);
		curl_close($ch);
		$r='';
		if($output==FALSE)
		{
			$r= 'code false';
		} else {
			$r= $output;
		}
		return $r;
	}
}
/*
	shell命令：curl -I -m 10 -o /dev/null -s -w %{http_code} http://test.com
	
	curl_init — 初始化一个curl会话
	curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
	curl_errno — 返回一个包含当前会话错误信息的数字编号
	curl_error — 返回一个包含当前会话错误信息的字符串
	curl_exec — 执行一个curl会话
	curl_getinfo — 获取一个curl连接资源句柄的信息
	curl_multi_init — 初始化一个curl批处理句柄资源
	curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
	curl_multi_close — 关闭一个批处理句柄资源
	curl_multi_exec — 解析一个curl批处理句柄
	curl_multi_getcontent — 返回获取的输出的文本流
	curl_multi_info_read — 获取当前解析的curl的相关传输信息
	curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
	curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
	curl_setopt_array — 以数组的形式为一个curl设置会话参数
	curl_setopt — 为一个curl设置会话参数
	curl_version — 获取curl相关的版本信息
	curl_close — 关闭一个curl会话
	
	curl爬取过程中，会返回一个http_code，下面是他们的意义信息
	
	$http_code["0"]="Unable to access";
	$http_code["100"]="Continue";
	$http_code["101"]="Switching Protocols";
	$http_code["200"]=”OK”;
	$http_code["201"]=”Created”;
	$http_code["202"]=”Accepted”;
	$http_code["203"]=”Non-Authoritative Information”;
	$http_code["204"]=”No Content”;
	$http_code["205"]=”Reset Content”;
	$http_code["206"]=”Partial Content”;
	$http_code["300"]=”Multiple Choices”;
	$http_code["301"]=”Moved Permanently”;
	$http_code["302"]=”Found”;
	$http_code["303"]=”See Other”;
	$http_code["304"]=”Not Modified”;
	$http_code["305"]=”Use Proxy”;
	$http_code["306"]=”(Unused)”;
	$http_code["307"]=”Temporary Redirect”;
	$http_code["400"]=”Bad Request”;
	$http_code["401"]=”Unauthorized”;
	$http_code["402"]=”Payment Required”;
	$http_code["403"]=”Forbidden”;
	$http_code["404"]=”Not Found”;
	$http_code["405"]=”Method Not Allowed”;
	$http_code["406"]=”Not Acceptable”;
	$http_code["407"]=”Proxy Authentication Required”;
	$http_code["408"]=”Request Timeout”;
	$http_code["409"]=”Conflict”;
	$http_code["410"]=”Gone”;
	$http_code["411"]=”Length Required”;
	$http_code["412"]=”Precondition Failed”;
	$http_code["413"]=”Request Entity Too Large”;
	$http_code["414"]=”Request-URI Too Long”;
	$http_code["415"]=”Unsupported Media Type”;
	$http_code["416"]=”Requested Range Not Satisfiable”;
	$http_code["417"]=”Expectation Failed”;
	$http_code["500"]=”Internal Server Error”;
	$http_code["501"]=”Not Implemented”;
	$http_code["502"]=”Bad Gateway”;
	$http_code["503"]=”Service Unavailable”;
	$http_code["504"]=”Gateway Timeout”;
	$http_code["505"]=”HTTP Version Not Supported”;
	
 */
